package com.ccnf.model.mapper;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
import com.ccnf.model.entity.Invitation;
import com.ccnf.model.entity.SocialUser;
import com.ccnf.model.pojo.InvitationDetail;
import com.ccnf.model.pojo.InvitationReferenceVo;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author developer
 * @since 2018-06-07
 */
public interface InvitationMapper extends BaseMapper<Invitation> {

    /**
     * 查询我的邀请函分页列表
     * @param page 分页参数
     * @param userId 当前用户ID
     * @param expoId 展会ID
     */
    List<Invitation> selectPersonalByUserId(Pagination page,
                                            @Param("expoId") Long expoId,
                                            @Param("userId") Long userId);

    /**
     * 通过用户ID查询用户收藏的邀请函列表信息
     * @param userId 用户ID
     * @param expoId 展会ID
     * @return 返回用户收藏的邀请函列表信息
     */
    List<InvitationDetail> selectCollectionByUserId(Pagination page,
                                                    @Param("expoId") Long expoId,
                                                    @Param("userId") Long userId);

    /**
     * 通过用户ID查询用户回收站的邀请函列表信息
     * @param userId 用户ID
     * @return 返回用户回收站的邀请函列表信息
     */
    List<Invitation> selectTrashByUserId(Pagination page,
                                         @Param("expoId") Long expoId,
                                         @Param("userId") Long userId);

    /**
     * 查询邀请函创建人的用户信息
     * @param invitationId 邀请函ID
     * @return 邀请函创建人的用户信息
     */
    SocialUser selectUserInfoByInvitationId(Long invitationId);

    /**
     * 通过邀请函ID获取邀请函基本信息，不带邀请函内容字段
     * @param invitationId 邀请函ID
     * @return 返回邀请函信息
     */
    Invitation selectBasicByInvitationId(Long invitationId);

    /**
     * 获取首页模板案例列表
     * @param page 分页参数
     * @param invitationTitle 模糊搜索邀请函标题
     * @return 返回邀请函列表数据
     */
    List<InvitationDetail> selectTemplateByUserId(Pagination page,
                                                  @Param("expoId") Long expoId,
                                                  @Param("invitationTitle") String invitationTitle);

    /**
     * 获取用户最新发布的一条邀请函信息
     * @param expoId 展会ID
     * @param userId 用户ID
     * @return 返回用户最新发布的邀请函信息
     */
    InvitationDetail selectLatestByUserId(@Param("expoId") Long expoId,
                                          @Param("userId") Long userId);

    /**
     * 查询用户发布的邀请函列表
     * @param expoId 展会ID
     * @param userId 用户ID
     */
    List<InvitationReferenceVo> selectPublishByUserId(@Param("expoId") Long expoId,
                                                      @Param("userId") Long userId,
                                                      Pagination pagination);

    /**
     * 查询全部可引用的邀请函列表
     * @param expoId 展会ID
     * @param userId 用户ID
     */
    List<InvitationReferenceVo> selectMoneyByUserId(@Param("expoId") Long expoId,
                                                    @Param("userId") Long userId,
                                                    Pagination pagination);

    /**
     * 查询我引用的邀请函列表
     * @param expoId 展会ID
     * @param userId 用户ID
     */
    List<InvitationReferenceVo> selectReferenceByUserId(@Param("expoId") Long expoId,
                                                        @Param("userId") Long userId,
                                                        Pagination pagination);

    /**
     * 查询用户是否引用过该邀请函
     * @param invitationId 引用的邀请函ID
     * @param userId 用户ID
     */
    int selectIsReferenceByInvitationIdAndUserId(@Param("invitationId") Long invitationId,
                                                 @Param("userId") Long userId);

    /**
     * 查询我被授权的邀请函列表
     * @param expoId 展会ID
     * @param userId 用户ID
     */
    List<InvitationReferenceVo> selectAuthByUserId(@Param("expoId") Long expoId,
                                                   @Param("userId") Long userId,
                                                   Pagination pagination);
}